/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.trandio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.NamingException;
import org.trandio.model.ActividadContratadaVO;
import org.trandio.model.ActividadVO;
import org.trandio.model.ContratoVO;
import org.trandio.model.GrupoActividadVO;
import org.trandio.util.ConexionDb;

/**
 *
 * @author root
 */
public class ContratoDAO implements ContratoInterface {

    @Override
    public int guardarContrato(ContratoVO contratoVO) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();


        String sqlAdiciona = "INSERT INTO tb_contrato("
                + "numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "id_regimen, id_tipo_documento) "
                + "VALUES (?, ?, ?, ?, ?, ?,?, ?, ?, ?,?, ?, ?, ?, ?,?, ?) RETURNING id;";

        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);




        int activo = (contratoVO.isActivo() == true) ? 1 : 0;
        int modelo = (contratoVO.isModelo() == true) ? 1 : 0;
        int pyp = (contratoVO.isPyp() == true) ? 1 : 0;



        java.util.Date inicio = contratoVO.getInicio();
        java.sql.Date iniciosql = new java.sql.Date(inicio.getTime());

        java.util.Date fin = contratoVO.getFin();
        java.sql.Date finsql = new java.sql.Date(fin.getTime());


        stmt.setString(1, contratoVO.getCodigo());
        stmt.setString(2, contratoVO.getDescripcion());
        stmt.setInt(3, contratoVO.getEntidad());
        stmt.setInt(4, contratoVO.getManual());
        stmt.setInt(5, contratoVO.getTipo());
        stmt.setInt(6, activo);
        stmt.setDate(7, iniciosql);
        stmt.setDate(8, finsql);
        stmt.setDouble(9, contratoVO.getMonto_cap());
        stmt.setDouble(10, contratoVO.getMonto_fac());
        stmt.setInt(11, contratoVO.getPorc_alarma());
        stmt.setDouble(12, contratoVO.getUpc_anual());
        stmt.setDouble(13, contratoVO.getUpc_mensual());
        stmt.setInt(14, modelo);
        stmt.setInt(15, pyp);
        stmt.setInt(16, contratoVO.getRegimen());
        stmt.setInt(17, contratoVO.getTipo());

        ResultSet rs = stmt.executeQuery();

        rs.next();

        int resp = rs.getInt(1);
        System.out.println("Insert Generar: " + resp);

        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

        return resp;
    }

    @Override
    public List<ContratoVO> consultarContrato(ContratoVO contratoVO) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> listContratoVO = new ArrayList<ContratoVO>();

        String condicion = "";

        if (contratoVO.getCodigo() == null) {
            contratoVO.setCodigo("");
        }
        if (contratoVO.getDescripcion() == null) {
            contratoVO.setDescripcion("");
        }

        if (!contratoVO.getCodigo().equals("") && contratoVO.getDescripcion().equals("")) {
            condicion = "WHERE tb_contrato.numero='" + contratoVO.getCodigo() + "'";
        } else if (!contratoVO.getDescripcion().equals("")) {
            condicion = "WHERE tb_contrato.descripcion LIKE '%" + contratoVO.getDescripcion() + "%'";
        }

        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato " + condicion;

        System.out.println("Sql buacar act: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    listContratoVO.add(contratoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listContratoVO;

    }

    @Override
    public String borrarContrato(int id) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();


        System.out.println("Id a eliminar:" + id);

        String sql = "delete from tb_contrato where tb_contrato.id=?";

        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setInt(1, id);

        stmt.execute();
        stmt.close();

        return "okborrar";
    }

    @Override
    public List<ContratoVO> consultarContratos() throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> listContratoVO = new ArrayList<ContratoVO>();


        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato";

        System.out.println("Sql buacar act: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet res = stmt.executeQuery();

        while (res.next()) {
            ContratoVO contratoVO = new ContratoVO();
            contratoVO.setId(res.getInt("id"));
            contratoVO.setCodigo(res.getString("numero"));
            contratoVO.setDescripcion(res.getString("descripcion"));
            listContratoVO.add(contratoVO);
        }

        res.close();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }
        return listContratoVO;
    }

    @Override
    public ContratoVO getContrato(int id) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();



        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato WHERE tb_contrato.id =" + id;

        System.out.println("Sql buacar act: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ContratoVO contratoVO = new ContratoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    contratoVO.setEntidad(res.getInt("id_entidad"));
                    contratoVO.setManual(res.getInt("id_manual"));
                    contratoVO.setTipo(res.getInt("id_tipo"));
                    contratoVO.setActivo(res.getBoolean("activo"));
                    contratoVO.setInicio(res.getDate("fecha_inicio"));
                    contratoVO.setFin(res.getDate("fecha_fin"));
                    contratoVO.setMonto_cap(res.getDouble("monto_capitacion"));
                    contratoVO.setMonto_fac(res.getDouble("monto_facturacion"));
                    contratoVO.setPorc_alarma(res.getInt("porcentaje_alarma"));
                    contratoVO.setUpc_anual(res.getDouble("upc_anual"));
                    contratoVO.setUpc_mensual(res.getDouble("upc_mensual"));
                    contratoVO.setModelo(res.getBoolean("es_modelo"));
                    contratoVO.setPyp(res.getBoolean("es_pyp"));
                    contratoVO.setRegimen(res.getInt("id_regimen"));
                    contratoVO.setTipo_doc(res.getInt("id_tipo_documento"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return contratoVO;


    }

    @Override
    public void guardarContratoEdit(ContratoVO contratoVO) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "UPDATE tb_contrato  SET numero=?, descripcion=?, id_entidad=?, id_manual=?, id_tipo=?,"
                + "activo=?, fecha_inicio=?, fecha_fin=?, monto_capitacion=?, monto_facturacion=?,"
                + "porcentaje_alarma=?, upc_anual=?, upc_mensual=?, es_modelo=?, "
                + "es_pyp=?,id_regimen=?, "
                + "id_tipo_documento=? WHERE tb_contrato.id=" + contratoVO.getId();

        System.out.println("SQL del Update=" + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        int activo = (contratoVO.isActivo() == true) ? 1 : 0;
        int modelo = (contratoVO.isModelo() == true) ? 1 : 0;
        int pyp = (contratoVO.isPyp() == true) ? 1 : 0;
        java.util.Date inicio = contratoVO.getInicio();
        java.sql.Date iniciosql = new java.sql.Date(inicio.getTime());
        java.util.Date fin = contratoVO.getFin();
        java.sql.Date finsql = new java.sql.Date(fin.getTime());
        stmt.setString(1, contratoVO.getCodigo());
        stmt.setString(2, contratoVO.getDescripcion());
        stmt.setInt(3, contratoVO.getEntidad());
        stmt.setInt(4, contratoVO.getManual());
        stmt.setInt(5, contratoVO.getTipo());
        stmt.setInt(6, activo);
        stmt.setDate(7, iniciosql);
        stmt.setDate(8, finsql);
        stmt.setDouble(9, contratoVO.getMonto_cap());
        stmt.setDouble(10, contratoVO.getMonto_fac());
        stmt.setInt(11, contratoVO.getPorc_alarma());
        stmt.setDouble(12, contratoVO.getUpc_anual());
        stmt.setDouble(13, contratoVO.getUpc_mensual());
        stmt.setInt(14, modelo);
        stmt.setInt(15, pyp);
        stmt.setInt(16, contratoVO.getRegimen());
        stmt.setInt(17, contratoVO.getTipo_doc());

        stmt.execute();
        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

    }

    @Override
    public void contratarActividad(int id_contrato, int id_actividad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sqlAdiciona = "INSERT INTO tb_contrato_actividad("
                + "id_contrato, id_actividad, esta_contratada, valor, modelo_descuento,id_tipo_contrato)"
                + "VALUES (" + id_contrato + "," + id_actividad + ",'1',0,0,1)";

        System.out.println("Insertar actividad contratada: " + sqlAdiciona);

        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sqlAdiciona);



        stmt.close();
        if (!conn.isClosed()) {
            conn.close();
        }

    }

    @Override
    public List<ActividadContratadaVO> consultarActividadesContratadas(int id_contrato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ActividadContratadaVO> listActividadContratoVO = new ArrayList<ActividadContratadaVO>();




        String sql = "SELECT "
                + "tb_contrato_actividad.id,"
                + "tb_actividad.codigo,"
                + "tb_actividad.descripcion,"
                + "tb_contrato_actividad.valor,"
                + "tb_contrato_actividad.id_actividad "
                + "FROM "
                + "public.tb_contrato_actividad,"
                + "public.tb_actividad "
                + "WHERE "
                + "tb_contrato_actividad.id_actividad = tb_actividad.id AND "
                + "tb_contrato_actividad.id_contrato =" + id_contrato;

        System.out.println("Sql buscar contratadas: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ActividadContratadaVO contratadaVO = new ActividadContratadaVO();
                    contratadaVO.setId(res.getInt("id"));
                    contratadaVO.setId_actividad(res.getInt("id_actividad"));
                    contratadaVO.setCodigo(res.getString("codigo"));
                    contratadaVO.setActividad(res.getString("descripcion"));
                    contratadaVO.setValor(res.getDouble("valor"));
                    listActividadContratoVO.add(contratadaVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listActividadContratoVO;
    }

    @Override
    public List<ActividadVO> consultarActividadesHabilitadas(String codigo, int grupo, int contrato) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        String condicion1 = "tb_actividad.codigo like '" + codigo + "%' AND";
        String condicion2 = "";

        List<ActividadVO> listActividadVO = new ArrayList<ActividadVO>();

        if (grupo > 0 && (codigo.equals("") || codigo.equals("0"))) {
            condicion2 = "AND tb_grupoactividad.id =" + grupo;
            condicion1 = "";
        }
        if (grupo > 0 && !(codigo.equals("") || codigo.equals("0"))) {
            condicion2 = "AND tb_grupoactividad.id =" + grupo;
        }



        String sql = "SELECT tb_actividad.id, tb_actividad.codigo,"
                + "tb_actividad.descripcion, tb_actividad.id_sexo,"
                + "tb_actividad.id_grupo_quir, tb_actividad.id_manual,"
                + "tb_actividad.es_insumo,tb_actividad.rip_rn,"
                + "tb_actividad.rip_estancia, tb_actividad.dos_vias,"
                + "tb_actividad.cruenta,tb_actividad.id_tipo_registro,"
                + "tb_actividad.id_grupo_funcional,tb_actividad.grupo_qx,"
                + "tb_actividad.id_cum,tb_manual.descripcion manual"
                + " FROM tb_actividad"
                + " INNER JOIN tb_manual ON (tb_actividad.id_manual = tb_manual.id)"
                + " INNER JOIN tb_grupoactividad ON (tb_actividad.id_grupo_funcional=tb_grupoactividad.id)"
                + " WHERE " + condicion1 + " tb_actividad.habilitada='1' " + condicion2
                + " AND tb_actividad.id not IN (SELECT tb_contrato_actividad.id_actividad "
                + " from tb_contrato_actividad WHERE"
                + " tb_contrato_actividad.id_contrato=" + contrato + ")";

        System.out.println("Sql BUSCAR ACTIVIDAD contrato codigo: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ActividadVO actividadVO = new ActividadVO();
                    actividadVO.setId(res.getInt("id"));
                    actividadVO.setCodigo(res.getString("codigo"));
                    actividadVO.setDescripcion(res.getString("descripcion"));
                    actividadVO.setDescmanual(res.getString("manual"));
                    listActividadVO.add(actividadVO);

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return listActividadVO;


    }

    @Override
    public void descontratarActividad(int id_contrato, int id_cto_act) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "DELETE FROM tb_contrato_actividad"
                + " WHERE tb_contrato_actividad.id_contrato=" + id_contrato
                + " AND tb_contrato_actividad.id=" + id_cto_act;

        System.out.println("Borrar actividad contratada: " + sql);

        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sql);

        stmt.close();
    }

    @Override
    public List<ContratoVO> consultarContrato(String codigo, String descripcion, int firstRow, int rowsPerPage, String sortField, boolean sortAscending) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> listContratoVO = new ArrayList<ContratoVO>();

        String condicion = "";



        if (codigo != null) {
            if (!codigo.equals("")) {
                condicion = " WHERE tb_contrato.numero = '" + codigo + "'";
            }
        }

        if (descripcion != null) {
            if (!descripcion.equals("")) {
                condicion = " WHERE tb_contrato.descripcion LIKE '%" + descripcion + "%'";
            }
        }




        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato " + condicion + " LIMIT " + rowsPerPage + " OFFSET " + firstRow;

        System.out.println("Sql buscar contrato: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ContratoVO contratoVO = new ContratoVO();
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    listContratoVO.add(contratoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listContratoVO;
    }

    @Override
    public List<ContratoVO> consultarContrato(String codigo, String descripcion) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> listContratoVO = new ArrayList<ContratoVO>();

        String condicion = "";



        if (codigo != null) {
            if (!codigo.equals("")) {
                condicion = " WHERE tb_contrato.numero = '" + codigo + "'";
            }
        }

        if (descripcion != null) {
            if (!descripcion.equals("")) {
                condicion = " WHERE tb_contrato.descripcion LIKE '%" + descripcion + "%'";
            }
        }




        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato " + condicion;

        System.out.println("Sql buscar contrato: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ContratoVO contratoVO = new ContratoVO();
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    listContratoVO.add(contratoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listContratoVO;
    }

    @Override
    public int count() throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT count(*) FROM tb_contrato";

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return count;
    }

    @Override
    public ContratoVO getContratoEntidad(int id_entidad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato WHERE tb_contrato.id_entidad =" + id_entidad
                + " AND fecha_fin>=CURRENT_DATE";

        System.out.println("Sql traer datos contrato por entidad: " + sql);
        PreparedStatement stmt = conn.prepareStatement(sql);
        ContratoVO contratoVO = new ContratoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    contratoVO.setEntidad(res.getInt("id_entidad"));
                    contratoVO.setManual(res.getInt("id_manual"));
                    contratoVO.setTipo(res.getInt("id_tipo"));
                    contratoVO.setActivo(res.getBoolean("activo"));
                    contratoVO.setInicio(res.getDate("fecha_inicio"));
                    contratoVO.setFin(res.getDate("fecha_fin"));
                    contratoVO.setMonto_cap(res.getDouble("monto_capitacion"));
                    contratoVO.setMonto_fac(res.getDouble("monto_facturacion"));
                    contratoVO.setPorc_alarma(res.getInt("porcentaje_alarma"));
                    contratoVO.setUpc_anual(res.getDouble("upc_anual"));
                    contratoVO.setUpc_mensual(res.getDouble("upc_mensual"));
                    contratoVO.setModelo(res.getBoolean("es_modelo"));
                    contratoVO.setPyp(res.getBoolean("es_pyp"));
                    contratoVO.setRegimen(res.getInt("id_regimen"));
                    contratoVO.setTipo_doc(res.getInt("id_tipo_documento"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return contratoVO;
    }

    
    
    @Override
     public ContratoVO getContratoEntidad(int id_entidad, int id_contrato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato WHERE tb_contrato.id_entidad =" + id_entidad + ""
                + " AND tb_contrato.id =" + id_contrato + " AND fecha_fin>=CURRENT_DATE";

        System.out.println("Sql traer datos contrato por entidad: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ContratoVO contratoVO = new ContratoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    contratoVO.setEntidad(res.getInt("id_entidad"));
                    contratoVO.setManual(res.getInt("id_manual"));
                    contratoVO.setTipo(res.getInt("id_tipo"));
                    contratoVO.setActivo(res.getBoolean("activo"));
                    contratoVO.setInicio(res.getDate("fecha_inicio"));
                    contratoVO.setFin(res.getDate("fecha_fin"));
                    contratoVO.setMonto_cap(res.getDouble("monto_capitacion"));
                    contratoVO.setMonto_fac(res.getDouble("monto_facturacion"));
                    contratoVO.setPorc_alarma(res.getInt("porcentaje_alarma"));
                    contratoVO.setUpc_anual(res.getDouble("upc_anual"));
                    contratoVO.setUpc_mensual(res.getDouble("upc_mensual"));
                    contratoVO.setModelo(res.getBoolean("es_modelo"));
                    contratoVO.setPyp(res.getBoolean("es_pyp"));
                    contratoVO.setRegimen(res.getInt("id_regimen"));
                    contratoVO.setTipo_doc(res.getInt("id_tipo_documento"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return contratoVO;
    }

    
    
    
    @Override
    public List<GrupoActividadVO> consultarGrupoContratado(int id) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<GrupoActividadVO> listGrupoVO = new ArrayList<GrupoActividadVO>();

        /*
         * String sql = "SELECT DISTINCT " + "tb_grupoactividad.id," +
         * "tb_grupoactividad.codigo," + "tb_grupoactividad.descripcion," +
         * "tb_copagos.id idcopago," + "tb_copagos.n0," + "tb_copagos.n4," +
         * "tb_copagos.n1," + "tb_copagos.n2," + "tb_copagos.n3 " + "FROM
         * tb_grupoactividad " + "INNER JOIN tb_actividad ON
         * (tb_grupoactividad.id = tb_actividad.id_grupo_funcional) " + "LEFT
         * JOIN tb_grupoactividad_copago ON (tb_grupoactividad.id =
         * tb_grupoactividad_copago.id_grupoactividad) " + "LEFT JOIN tb_copagos
         * ON (tb_grupoactividad_copago.id_copagos = tb_copagos.id) " + "WHERE
         * tb_grupoactividad_copago.id_contrato = "+id;
         */


        String sql = "SELECT DISTINCT tb_grupoactividad.id,tb_grupoactividad.codigo,tb_grupoactividad.descripcion"
                + " FROM tb_grupoactividad "
                + "INNER JOIN tb_actividad ON (tb_grupoactividad.id = tb_actividad.id_grupo_funcional) "
                + "INNER JOIN tb_contrato_actividad ON (tb_contrato_actividad.id_actividad=tb_actividad.id)"
                + " WHERE tb_contrato_actividad.id_contrato = " + id;

        System.out.println("Sql buscar grupo contrato: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    GrupoActividadVO grupoContratadoVO = new GrupoActividadVO();
                    grupoContratadoVO.setId(res.getInt("id"));
                    grupoContratadoVO.setCodigo(res.getString("codigo"));
                    grupoContratadoVO.setDescripcion(res.getString("descripcion"));
                    listGrupoVO.add(grupoContratadoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listGrupoVO;
    }

    @Override
    public void asignarCopagosGrupo(String idgrupo, String idcto, String idcopago) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();


        String sqlElimina = "DELETE FROM tb_grupoactividad_copago "
                + "WHERE tb_grupoactividad_copago.id_grupoactividad =" + idgrupo
                + " AND tb_grupoactividad_copago.id_contrato=" + idcto;

        System.out.println("Borrar copago=" + sqlElimina);

        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sqlElimina);
        stmt.close();

        String sqlAdiciona = "INSERT INTO tb_grupoactividad_copago(id_contrato, id_grupoactividad, id_copagos)"
                + "VALUES (" + idcto + "," + idgrupo + "," + idcopago + ")";

        System.out.println("Ingresar copago=" + sqlAdiciona);

        Statement stmt1 = conn.createStatement();
        stmt1.executeUpdate(sqlAdiciona);
        stmt1.close();
        if (!conn.isClosed()) {
            conn.close();
        }


    }

    @Override
    public List<ActividadContratadaVO> consultarActividadesContratadas(int cto, int first, int limit, String codact, int grupo) throws SQLException, NamingException {

        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ActividadContratadaVO> listActividadContratoVO = new ArrayList<ActividadContratadaVO>();


        String condicion1 = " AND tb_actividad.codigo like '" + codact + "%' ";
        String condicion2 = "";

        List<ActividadVO> listActividadVO = new ArrayList<ActividadVO>();

        if (grupo > 0 && (codact.equals("") || codact.equals("0"))) {
            condicion2 = " AND tb_grupoactividad.id =" + grupo;
            condicion1 = "";
        }
        if (grupo > 0 && !(codact.equals("") || codact.equals("0"))) {
            condicion2 = " AND tb_grupoactividad.id =" + grupo;
        }


        /*
         * String condicion = "";
         *
         * if(!codact.equals("")){ condicion = " AND tb_actividad.codigo like
         * '"+codact+"%'"; }
         */



        String sql = "SELECT "
                + "tb_contrato_actividad.id,"
                + "tb_actividad.codigo,"
                + "tb_actividad.descripcion,"
                + "tb_contrato_actividad.valor,"
                + "tb_contrato_actividad.id_actividad "
                + "FROM "
                + "public.tb_contrato_actividad,"
                + "public.tb_actividad "
                + " INNER JOIN tb_grupoactividad ON (tb_actividad.id_grupo_funcional=tb_grupoactividad.id)"
                + "WHERE "
                + "tb_contrato_actividad.id_actividad = tb_actividad.id AND "
                + "tb_contrato_actividad.id_contrato =" + cto + condicion1 + condicion2 + " LIMIT " + limit + " OFFSET " + first;

        System.out.println("Sql buscar contratadas: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ActividadContratadaVO contratadaVO = new ActividadContratadaVO();
                    contratadaVO.setId(res.getInt("id"));
                    contratadaVO.setId_actividad(res.getInt("id_actividad"));
                    contratadaVO.setCodigo(res.getString("codigo"));
                    contratadaVO.setActividad(res.getString("descripcion"));
                    contratadaVO.setValor(res.getDouble("valor"));
                    listActividadContratoVO.add(contratadaVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listActividadContratoVO;

    }

    @Override
    public int contarContratadas(int idContrato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT count(*) FROM tb_contrato_actividad WHERE id_contrato=" + idContrato;

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return count;
    }

    @Override
    public ContratoVO getContratoPypEntidad(int id_entidad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato WHERE tb_contrato.id_entidad =" + id_entidad
                + " AND fecha_fin>=CURRENT_DATE AND es_pyp='1'";

        System.out.println("Sql traer datos contrato por entidad: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ContratoVO contratoVO = new ContratoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    contratoVO.setEntidad(res.getInt("id_entidad"));
                    contratoVO.setManual(res.getInt("id_manual"));
                    contratoVO.setTipo(res.getInt("id_tipo"));
                    contratoVO.setActivo(res.getBoolean("activo"));
                    contratoVO.setInicio(res.getDate("fecha_inicio"));
                    contratoVO.setFin(res.getDate("fecha_fin"));
                    contratoVO.setMonto_cap(res.getDouble("monto_capitacion"));
                    contratoVO.setMonto_fac(res.getDouble("monto_facturacion"));
                    contratoVO.setPorc_alarma(res.getInt("porcentaje_alarma"));
                    contratoVO.setUpc_anual(res.getDouble("upc_anual"));
                    contratoVO.setUpc_mensual(res.getDouble("upc_mensual"));
                    contratoVO.setModelo(res.getBoolean("es_modelo"));
                    contratoVO.setPyp(res.getBoolean("es_pyp"));
                    contratoVO.setRegimen(res.getInt("id_regimen"));
                    contratoVO.setTipo_doc(res.getInt("id_tipo_documento"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return contratoVO;
    }

    @Override
    public List<ContratoVO> getContratoEntidadFacturacion(int entidad) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> listContratoVO = new ArrayList<ContratoVO>();

        String condicion = "AND id_entidad=" + entidad;


        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato  WHERE fecha_fin>=CURRENT_DATE  " + condicion;

        System.out.println("Sql BUSCAR CONTRATOS ENTIDAD: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    ContratoVO contratoVO = new ContratoVO();
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    listContratoVO.add(contratoVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }
        return listContratoVO;

    }

    @Override
    public void descontratarGrupo(int idCont, int idGrupo) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "DELETE FROM tb_contrato_actividad"
                + " WHERE tb_contrato_actividad.id_contrato=" + idCont
                + " AND tb_contrato_actividad.id_actividad IN (select id FROM tb_actividad WHERE id_grupo_funcional=" + idGrupo + ")";

        System.out.println("Borrar GRUPO contratado: " + sql);

        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sql);

        stmt.close();
    }

    @Override
    public GrupoActividadVO getCopagosGrupo(int idgrupo, int cto) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT "
                + "tb_copagos.id idcopago,tb_copagos.n0,tb_copagos.n4,tb_copagos.n1,tb_copagos.n2,tb_copagos.n3 "
                + " FROM tb_copagos"
                + " INNER JOIN tb_grupoactividad_copago ON (tb_copagos.id = tb_grupoactividad_copago.id_copagos) "
                + " WHERE tb_grupoactividad_copago.id_grupoactividad = " + idgrupo
                + " AND tb_grupoactividad_copago.id_contrato=" + cto;

        System.out.println("Sql traer datos contrato por entidad: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        GrupoActividadVO gru = new GrupoActividadVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    gru.setIdcopago(res.getInt("idcopago"));
                    gru.setDn0(res.getInt("n0"));
                    gru.setDn1(res.getInt("n1"));
                    gru.setDn2(res.getInt("n2"));
                    gru.setDn3(res.getInt("n3"));
                    gru.setDn4(res.getInt("n4"));


                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return gru;

    }

    @Override
    public int getCantContratos(String $sWhere) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        int count = 0;

        String sql = "SELECT count(*) FROM tb_contrato";

        PreparedStatement stmt = conn.prepareStatement(sql);

        try {
            ResultSet res = stmt.executeQuery();
            try {
                if (res.next()) {
                    count = res.getInt(1);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return count;
    }

    @Override
    public List<ContratoVO> getContratos(int displayStart, int displayLength, String $sWhere, String orden) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<ContratoVO> lista = new ArrayList<ContratoVO>();
        String condicion = "";

        if (!$sWhere.equals("")) {
            //condicion = " WHERE tb_factura.numero LIKE '%"+param+"%' ";
            condicion = $sWhere;
        }



        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato " + condicion + " " + orden + " LIMIT " + displayLength + " OFFSET " + displayStart;

        System.out.println("Sql BUSCAR CONTRATOS: " + sql);


        PreparedStatement stmt = conn.prepareStatement(sql);


        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {


                    ContratoVO objVO = new ContratoVO();
                    objVO.setId(res.getInt("id"));
                    objVO.setCodigo(res.getString("numero"));
                    objVO.setDescripcion(res.getString("descripcion"));
                    objVO.setInicio(res.getDate("fecha_inicio"));
                    objVO.setFin(res.getDate("fecha_fin"));
                    objVO.setActivo(res.getString("activo").equals("1") ? true : false);


                    lista.add(objVO);
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }

        return lista;
    }
    
     
     
     @Override
    public ContratoVO getContratoPyp(int id_contrato) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "SELECT id, numero, descripcion, id_entidad, id_manual, id_tipo, activo,"
                + "fecha_inicio, fecha_fin, monto_capitacion, monto_facturacion,"
                + "porcentaje_alarma, upc_anual, upc_mensual, es_modelo, es_pyp,"
                + "valor_facturado, valor_capitado, id_regimen, id_tipo_documento"
                + " FROM tb_contrato WHERE tb_contrato.id =" + id_contrato
                + " AND fecha_fin>=CURRENT_DATE AND es_pyp='1'";

        System.out.println("Sql traer datos contrato por entidad: " + sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ContratoVO contratoVO = new ContratoVO();
        try {
            ResultSet res = stmt.executeQuery();
            try {

                if (res.next()) {
                    contratoVO.setId(res.getInt("id"));
                    contratoVO.setCodigo(res.getString("numero"));
                    contratoVO.setDescripcion(res.getString("descripcion"));
                    contratoVO.setEntidad(res.getInt("id_entidad"));
                    contratoVO.setManual(res.getInt("id_manual"));
                    contratoVO.setTipo(res.getInt("id_tipo"));
                    contratoVO.setActivo(res.getBoolean("activo"));
                    contratoVO.setInicio(res.getDate("fecha_inicio"));
                    contratoVO.setFin(res.getDate("fecha_fin"));
                    contratoVO.setMonto_cap(res.getDouble("monto_capitacion"));
                    contratoVO.setMonto_fac(res.getDouble("monto_facturacion"));
                    contratoVO.setPorc_alarma(res.getInt("porcentaje_alarma"));
                    contratoVO.setUpc_anual(res.getDouble("upc_anual"));
                    contratoVO.setUpc_mensual(res.getDouble("upc_mensual"));
                    contratoVO.setModelo(res.getBoolean("es_modelo"));
                    contratoVO.setPyp(res.getBoolean("es_pyp"));
                    contratoVO.setRegimen(res.getInt("id_regimen"));
                    contratoVO.setTipo_doc(res.getInt("id_tipo_documento"));
                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
            if (!conn.isClosed()) {
                conn.close();
            }
        }


        return contratoVO;
    }

     
    
    
}